package org.az.netty_study.p09_netty组件之ByteBuf;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.CompositeByteBuf;

import static org.az.netty_study.ByteBufferUtil.logBuf;

/**
 * slice是将一个大的ByteBuf切片成多个小的ByteBuf，并不会发生数据复制
 * composite正相反，composite是将多个小的ByteBuf组成成一个大的ByteBuf，也不会发生数据复制，这说明ByteBuf在内存上不必连续
 */
public class _5_composite {
    public static void main(String[] args) {
        //两个小的ByteBuf
        ByteBuf buf1 = ByteBufAllocator.DEFAULT.buffer();
        buf1.writeBytes(new byte[]{'a', 'b', 'c', 'd'});

        ByteBuf buf2 = ByteBufAllocator.DEFAULT.buffer();
        buf2.writeBytes(new byte[]{'e', 'f', 'g', 'h', 'i', 'j', 'k'});

        /**
         * 如何组合他们成一个大ByteBuf?
         *  1.思路1:创建一个大ByteBuf，将小ByteBuf的内容依次写入大ByteBuf
         *  2.思路2:以链表的形式组合其这些小ByteBuf，让它们在逻辑上变成一个大ByteBuf
         * 毫无疑问，当然思路2更好
         */
        CompositeByteBuf compositeBuf = ByteBufAllocator.DEFAULT.compositeBuffer();
        compositeBuf.addComponents(true, buf1, buf2);
        //compositeBuf的内容就是abcdefghijk
        logBuf(compositeBuf);
        //为了正确使用原始小ByteBuf，应该在合并后，进行一次retain，使用完毕后再release
        buf1.retain();
        buf2.retain();
        System.out.println(compositeBuf.getByte(0));
    }
}
